// 定义了一个接口，接口一般首字母大写。有的编程语言中会建议接口的名称加上 I 前缀
interface IPerson {
  name: String;
  // age:Number
  age?: Number; // 加上？代表创建对象的时候age属性可有可无
  // [propName: string]: any //一个接口允许有任意的属性
  // 一旦定义了任意属性，那么确定属性和可选属性的类型都必须是它的类型的子集
  // [propName: string]: String
  // 一个接口中只能定义一个任意属性。如果接口中有多个类型的属性，则可以在任意属性中使用联合类型
  [propName: string]: String | Number; //接口中允许有String类型和Number类型
  readonly id: Number; //只读属性
  // 只读的约束存在于第一次给对象赋值的时候，而不是第一次给只读属性赋值的时候
}

// 定义一个通过接口约束的对象
const p: IPerson = {
  id: 1,
  name: "zp", //值必须为String类型
  age: 18, //值必须为Number类型
  // sex:'男' //sex在接口中没定义，但接口允许可以有任意属性
};

// p.id=2 //报错，因为id为只读属性